home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / linux / nfsd / nfsd.h < prev    next >
C/C++ Source or Header  |  2005-10-13  |  13KB  |  311 lines

  1. /*
  2.  * linux/include/linux/nfsd/nfsd.h
  3.  *
  4.  * Hodge-podge collection of knfsd-related stuff.
  5.  * I will sort this out later.
  6.  *
  7.  * Copyright (C) 1995-1997 Olaf Kirch <okir@monad.swb.de>
  8.  */
  9.  
  10. #ifndef LINUX_NFSD_NFSD_H
  11. #define LINUX_NFSD_NFSD_H
  12.  
  13. #include <linux/config.h>
  14. #include <linux/types.h>
  15. #include <linux/unistd.h>
  16. #include <linux/dirent.h>
  17. #include <linux/fs.h>
  18. #include <linux/mount.h>
  19.  
  20. #include <linux/nfsd/debug.h>
  21. #include <linux/nfsd/nfsfh.h>
  22. #include <linux/nfsd/export.h>
  23. #include <linux/nfsd/auth.h>
  24. #include <linux/nfsd/stats.h>
  25. #include <linux/nfsd/interface.h>
  26. /*
  27.  * nfsd version
  28.  */
  29. #define NFSD_VERSION        "0.5"
  30. #define NFSD_SUPPORTED_MINOR_VERSION    0
  31.  
  32. #ifdef __KERNEL__
  33. /*
  34.  * Special flags for nfsd_permission. These must be different from MAY_READ,
  35.  * MAY_WRITE, and MAY_EXEC.
  36.  */
  37. #define MAY_NOP            0
  38. #define MAY_SATTR        8
  39. #define MAY_TRUNC        16
  40. #define MAY_LOCK        32
  41. #define MAY_OWNER_OVERRIDE    64
  42. #define    MAY_LOCAL_ACCESS    128 /* IRIX doing local access check on device special file*/
  43. #if (MAY_SATTR | MAY_TRUNC | MAY_LOCK | MAY_OWNER_OVERRIDE | MAY_LOCAL_ACCESS) & (MAY_READ | MAY_WRITE | MAY_EXEC)
  44. # error "please use a different value for MAY_SATTR or MAY_TRUNC or MAY_LOCK or MAY_LOCAL_ACCESS or MAY_OWNER_OVERRIDE."
  45. #endif
  46. #define MAY_CREATE        (MAY_EXEC|MAY_WRITE)
  47. #define MAY_REMOVE        (MAY_EXEC|MAY_WRITE|MAY_TRUNC)
  48.  
  49. /*
  50.  * Callback function for readdir
  51.  */
  52. struct readdir_cd {
  53.     int            err;    /* 0, nfserr, or nfserr_eof */
  54. };
  55. typedef int        (*encode_dent_fn)(struct readdir_cd *, const char *,
  56.                         int, loff_t, ino_t, unsigned int);
  57. typedef int (*nfsd_dirop_t)(struct inode *, struct dentry *, int, int);
  58.  
  59. extern struct svc_program    nfsd_program;
  60. extern struct svc_version    nfsd_version2, nfsd_version3,
  61.                 nfsd_version4;
  62.  
  63. /*
  64.  * Function prototypes.
  65.  */
  66. int        nfsd_svc(unsigned short port, int nrservs);
  67. int        nfsd_dispatch(struct svc_rqst *rqstp, u32 *statp);
  68.  
  69. /* nfsd/vfs.c */
  70. int        fh_lock_parent(struct svc_fh *, struct dentry *);
  71. int        nfsd_racache_init(int);
  72. void        nfsd_racache_shutdown(void);
  73. int        nfsd_cross_mnt(struct svc_rqst *rqstp, struct dentry **dpp,
  74.                         struct svc_export **expp);
  75. int        nfsd_lookup(struct svc_rqst *, struct svc_fh *,
  76.                 const char *, int, struct svc_fh *);
  77. int        nfsd_setattr(struct svc_rqst *, struct svc_fh *,
  78.                 struct iattr *, int, time_t);
  79. #ifdef CONFIG_NFSD_V4
  80. int             nfsd4_set_nfs4_acl(struct svc_rqst *, struct svc_fh *,
  81.                     struct nfs4_acl *);
  82. int             nfsd4_get_nfs4_acl(struct svc_rqst *, struct dentry *, struct nfs4_acl **);
  83. #endif /* CONFIG_NFSD_V4 */
  84. int        nfsd_create(struct svc_rqst *, struct svc_fh *,
  85.                 char *name, int len, struct iattr *attrs,
  86.                 int type, dev_t rdev, struct svc_fh *res);
  87. #ifdef CONFIG_NFSD_V3
  88. int        nfsd_access(struct svc_rqst *, struct svc_fh *, u32 *, u32 *);
  89. int        nfsd_create_v3(struct svc_rqst *, struct svc_fh *,
  90.                 char *name, int len, struct iattr *attrs,
  91.                 struct svc_fh *res, int createmode,
  92.                 u32 *verifier, int *truncp);
  93. int        nfsd_commit(struct svc_rqst *, struct svc_fh *,
  94.                 loff_t, unsigned long);
  95. #endif /* CONFIG_NFSD_V3 */
  96. int        nfsd_open(struct svc_rqst *, struct svc_fh *, int,
  97.                 int, struct file **);
  98. void        nfsd_close(struct file *);
  99. int        nfsd_read(struct svc_rqst *, struct svc_fh *,
  100.                 loff_t, struct kvec *,int, unsigned long *);
  101. int        nfsd_write(struct svc_rqst *, struct svc_fh *,
  102.                 loff_t, struct kvec *,int, unsigned long, int *);
  103. int        nfsd_readlink(struct svc_rqst *, struct svc_fh *,
  104.                 char *, int *);
  105. int        nfsd_symlink(struct svc_rqst *, struct svc_fh *,
  106.                 char *name, int len, char *path, int plen,
  107.                 struct svc_fh *res, struct iattr *);
  108. int        nfsd_link(struct svc_rqst *, struct svc_fh *,
  109.                 char *, int, struct svc_fh *);
  110. int        nfsd_rename(struct svc_rqst *,
  111.                 struct svc_fh *, char *, int,
  112.                 struct svc_fh *, char *, int);
  113. int        nfsd_remove(struct svc_rqst *,
  114.                 struct svc_fh *, char *, int);
  115. int        nfsd_unlink(struct svc_rqst *, struct svc_fh *, int type,
  116.                 char *name, int len);
  117. int        nfsd_truncate(struct svc_rqst *, struct svc_fh *,
  118.                 unsigned long size);
  119. int        nfsd_readdir(struct svc_rqst *, struct svc_fh *,
  120.                  loff_t *, struct readdir_cd *, encode_dent_fn);
  121. int        nfsd_statfs(struct svc_rqst *, struct svc_fh *,
  122.                 struct kstatfs *);
  123.  
  124. int        nfsd_notify_change(struct inode *, struct iattr *);
  125. int        nfsd_permission(struct svc_export *, struct dentry *, int);
  126.  
  127.  
  128. /* 
  129.  * NFSv4 State
  130.  */
  131. #ifdef CONFIG_NFSD_V4
  132. void nfs4_state_init(void);
  133. void nfs4_state_shutdown(void);
  134. time_t nfs4_lease_time(void);
  135. void nfs4_reset_lease(time_t leasetime);
  136. #else
  137. void static inline nfs4_state_init(void){}
  138. void static inline nfs4_state_shutdown(void){}
  139. time_t static inline nfs4_lease_time(void){return 0;}
  140. void static inline nfs4_reset_lease(time_t leasetime){}
  141. #endif
  142.  
  143. /*
  144.  * lockd binding
  145.  */
  146. void        nfsd_lockd_init(void);
  147. void        nfsd_lockd_shutdown(void);
  148.  
  149.  
  150. /*
  151.  * These macros provide pre-xdr'ed values for faster operation.
  152.  */
  153. #define    nfs_ok            __constant_htonl(NFS_OK)
  154. #define    nfserr_perm        __constant_htonl(NFSERR_PERM)
  155. #define    nfserr_noent        __constant_htonl(NFSERR_NOENT)
  156. #define    nfserr_io        __constant_htonl(NFSERR_IO)
  157. #define    nfserr_nxio        __constant_htonl(NFSERR_NXIO)
  158. #define    nfserr_eagain        __constant_htonl(NFSERR_EAGAIN)
  159. #define    nfserr_acces        __constant_htonl(NFSERR_ACCES)
  160. #define    nfserr_exist        __constant_htonl(NFSERR_EXIST)
  161. #define    nfserr_xdev        __constant_htonl(NFSERR_XDEV)
  162. #define    nfserr_nodev        __constant_htonl(NFSERR_NODEV)
  163. #define    nfserr_notdir        __constant_htonl(NFSERR_NOTDIR)
  164. #define    nfserr_isdir        __constant_htonl(NFSERR_ISDIR)
  165. #define    nfserr_inval        __constant_htonl(NFSERR_INVAL)
  166. #define    nfserr_fbig        __constant_htonl(NFSERR_FBIG)
  167. #define    nfserr_nospc        __constant_htonl(NFSERR_NOSPC)
  168. #define    nfserr_rofs        __constant_htonl(NFSERR_ROFS)
  169. #define    nfserr_mlink        __constant_htonl(NFSERR_MLINK)
  170. #define    nfserr_opnotsupp    __constant_htonl(NFSERR_OPNOTSUPP)
  171. #define    nfserr_nametoolong    __constant_htonl(NFSERR_NAMETOOLONG)
  172. #define    nfserr_notempty        __constant_htonl(NFSERR_NOTEMPTY)
  173. #define    nfserr_dquot        __constant_htonl(NFSERR_DQUOT)
  174. #define    nfserr_stale        __constant_htonl(NFSERR_STALE)
  175. #define    nfserr_remote        __constant_htonl(NFSERR_REMOTE)
  176. #define    nfserr_wflush        __constant_htonl(NFSERR_WFLUSH)
  177. #define    nfserr_badhandle    __constant_htonl(NFSERR_BADHANDLE)
  178. #define    nfserr_notsync        __constant_htonl(NFSERR_NOT_SYNC)
  179. #define    nfserr_badcookie    __constant_htonl(NFSERR_BAD_COOKIE)
  180. #define    nfserr_notsupp        __constant_htonl(NFSERR_NOTSUPP)
  181. #define    nfserr_toosmall        __constant_htonl(NFSERR_TOOSMALL)
  182. #define    nfserr_serverfault    __constant_htonl(NFSERR_SERVERFAULT)
  183. #define    nfserr_badtype        __constant_htonl(NFSERR_BADTYPE)
  184. #define    nfserr_jukebox        __constant_htonl(NFSERR_JUKEBOX)
  185. #define    nfserr_denied        __constant_htonl(NFSERR_DENIED)
  186. #define    nfserr_deadlock        __constant_htonl(NFSERR_DEADLOCK)
  187. #define nfserr_expired          __constant_htonl(NFSERR_EXPIRED)
  188. #define    nfserr_bad_cookie    __constant_htonl(NFSERR_BAD_COOKIE)
  189. #define    nfserr_same        __constant_htonl(NFSERR_SAME)
  190. #define    nfserr_clid_inuse    __constant_htonl(NFSERR_CLID_INUSE)
  191. #define    nfserr_stale_clientid    __constant_htonl(NFSERR_STALE_CLIENTID)
  192. #define    nfserr_resource        __constant_htonl(NFSERR_RESOURCE)
  193. #define    nfserr_nofilehandle    __constant_htonl(NFSERR_NOFILEHANDLE)
  194. #define    nfserr_minor_vers_mismatch    __constant_htonl(NFSERR_MINOR_VERS_MISMATCH)
  195. #define nfserr_share_denied    __constant_htonl(NFSERR_SHARE_DENIED)
  196. #define nfserr_stale_stateid    __constant_htonl(NFSERR_STALE_STATEID)
  197. #define nfserr_old_stateid    __constant_htonl(NFSERR_OLD_STATEID)
  198. #define nfserr_bad_stateid    __constant_htonl(NFSERR_BAD_STATEID)
  199. #define nfserr_bad_seqid    __constant_htonl(NFSERR_BAD_SEQID)
  200. #define    nfserr_symlink        __constant_htonl(NFSERR_SYMLINK)
  201. #define    nfserr_not_same        __constant_htonl(NFSERR_NOT_SAME)
  202. #define    nfserr_restorefh    __constant_htonl(NFSERR_RESTOREFH)
  203. #define    nfserr_attrnotsupp    __constant_htonl(NFSERR_ATTRNOTSUPP)
  204. #define    nfserr_bad_xdr        __constant_htonl(NFSERR_BAD_XDR)
  205. #define    nfserr_openmode        __constant_htonl(NFSERR_OPENMODE)
  206. #define    nfserr_locks_held    __constant_htonl(NFSERR_LOCKS_HELD)
  207. #define    nfserr_op_illegal    __constant_htonl(NFSERR_OP_ILLEGAL)
  208. #define    nfserr_grace        __constant_htonl(NFSERR_GRACE)
  209. #define    nfserr_no_grace        __constant_htonl(NFSERR_NO_GRACE)
  210. #define    nfserr_reclaim_bad    __constant_htonl(NFSERR_RECLAIM_BAD)
  211. #define    nfserr_badname        __constant_htonl(NFSERR_BADNAME)
  212.  
  213. /* error codes for internal use */
  214. /* if a request fails due to kmalloc failure, it gets dropped.
  215.  *  Client should resend eventually
  216.  */
  217. #define    nfserr_dropit        __constant_htonl(30000)
  218. /* end-of-file indicator in readdir */
  219. #define    nfserr_eof        __constant_htonl(30001)
  220.  
  221. /* Check for dir entries '.' and '..' */
  222. #define isdotent(n, l)    (l < 3 && n[0] == '.' && (l == 1 || n[1] == '.'))
  223.  
  224. /*
  225.  * Time of server startup
  226.  */
  227. extern struct timeval    nfssvc_boot;
  228.  
  229. static inline int is_fsid(struct svc_fh *fh, struct knfsd_fh *reffh)
  230. {
  231.     if (fh->fh_export->ex_flags & NFSEXP_FSID) {
  232.         struct vfsmount *mnt = fh->fh_export->ex_mnt;
  233.         if (!old_valid_dev(mnt->mnt_sb->s_dev) ||
  234.             (reffh->fh_version == 1 && reffh->fh_fsid_type == 1))
  235.             return 1;
  236.     }
  237.     return 0;
  238. }
  239.  
  240.  
  241. #ifdef CONFIG_NFSD_V4
  242.  
  243. /* before processing a COMPOUND operation, we have to check that there
  244.  * is enough space in the buffer for XDR encode to succeed.  otherwise,
  245.  * we might process an operation with side effects, and be unable to
  246.  * tell the client that the operation succeeded.
  247.  *
  248.  * COMPOUND_SLACK_SPACE - this is the minimum amount of buffer space
  249.  * needed to encode an "ordinary" _successful_ operation.  (GETATTR,
  250.  * READ, READDIR, and READLINK have their own buffer checks.)  if we
  251.  * fall below this level, we fail the next operation with NFS4ERR_RESOURCE.
  252.  *
  253.  * COMPOUND_ERR_SLACK_SPACE - this is the minimum amount of buffer space
  254.  * needed to encode an operation which has failed with NFS4ERR_RESOURCE.
  255.  * care is taken to ensure that we never fall below this level for any
  256.  * reason.
  257.  */
  258. #define    COMPOUND_SLACK_SPACE        140    /* OP_GETFH */
  259. #define COMPOUND_ERR_SLACK_SPACE    12     /* OP_SETATTR */
  260.  
  261. #define NFSD_LEASE_TIME                 (nfs4_lease_time())
  262. #define NFSD_LAUNDROMAT_MINTIMEOUT      10   /* seconds */
  263.  
  264. /*
  265.  * The following attributes are currently not supported by the NFSv4 server:
  266.  *    ARCHIVE       (deprecated anyway)
  267.  *    FS_LOCATIONS  (will be supported eventually)
  268.  *    HIDDEN        (unlikely to be supported any time soon)
  269.  *    MIMETYPE      (unlikely to be supported any time soon)
  270.  *    QUOTA_*       (will be supported in a forthcoming patch)
  271.  *    SYSTEM        (unlikely to be supported any time soon)
  272.  *    TIME_BACKUP   (unlikely to be supported any time soon)
  273.  *    TIME_CREATE   (unlikely to be supported any time soon)
  274.  */
  275. #define NFSD_SUPPORTED_ATTRS_WORD0                                                          \
  276. (FATTR4_WORD0_SUPPORTED_ATTRS   | FATTR4_WORD0_TYPE         | FATTR4_WORD0_FH_EXPIRE_TYPE   \
  277.  | FATTR4_WORD0_CHANGE          | FATTR4_WORD0_SIZE         | FATTR4_WORD0_LINK_SUPPORT     \
  278.  | FATTR4_WORD0_SYMLINK_SUPPORT | FATTR4_WORD0_NAMED_ATTR   | FATTR4_WORD0_FSID             \
  279.  | FATTR4_WORD0_UNIQUE_HANDLES  | FATTR4_WORD0_LEASE_TIME   | FATTR4_WORD0_RDATTR_ERROR     \
  280.  | FATTR4_WORD0_ACLSUPPORT      | FATTR4_WORD0_CANSETTIME   | FATTR4_WORD0_CASE_INSENSITIVE \
  281.  | FATTR4_WORD0_CASE_PRESERVING | FATTR4_WORD0_CHOWN_RESTRICTED                             \
  282.  | FATTR4_WORD0_FILEHANDLE      | FATTR4_WORD0_FILEID       | FATTR4_WORD0_FILES_AVAIL      \
  283.  | FATTR4_WORD0_FILES_FREE      | FATTR4_WORD0_FILES_TOTAL  | FATTR4_WORD0_HOMOGENEOUS      \
  284.  | FATTR4_WORD0_MAXFILESIZE     | FATTR4_WORD0_MAXLINK      | FATTR4_WORD0_MAXNAME          \
  285.  | FATTR4_WORD0_MAXREAD         | FATTR4_WORD0_MAXWRITE     | FATTR4_WORD0_ACL)
  286.  
  287. #define NFSD_SUPPORTED_ATTRS_WORD1                                                          \
  288. (FATTR4_WORD1_MODE              | FATTR4_WORD1_NO_TRUNC     | FATTR4_WORD1_NUMLINKS         \
  289.  | FATTR4_WORD1_OWNER            | FATTR4_WORD1_OWNER_GROUP  | FATTR4_WORD1_RAWDEV           \
  290.  | FATTR4_WORD1_SPACE_AVAIL     | FATTR4_WORD1_SPACE_FREE   | FATTR4_WORD1_SPACE_TOTAL      \
  291.  | FATTR4_WORD1_SPACE_USED      | FATTR4_WORD1_TIME_ACCESS  | FATTR4_WORD1_TIME_ACCESS_SET  \
  292.  | FATTR4_WORD1_TIME_DELTA   | FATTR4_WORD1_TIME_METADATA    \
  293.  | FATTR4_WORD1_TIME_MODIFY     | FATTR4_WORD1_TIME_MODIFY_SET | FATTR4_WORD1_MOUNTED_ON_FILEID)
  294.  
  295. /* These will return ERR_INVAL if specified in GETATTR or READDIR. */
  296. #define NFSD_WRITEONLY_ATTRS_WORD1                                \
  297. (FATTR4_WORD1_TIME_ACCESS_SET   | FATTR4_WORD1_TIME_MODIFY_SET)
  298.  
  299. /* These are the only attrs allowed in CREATE/OPEN/SETATTR. */
  300. #define NFSD_WRITEABLE_ATTRS_WORD0                                                          \
  301. (FATTR4_WORD0_SIZE              | FATTR4_WORD0_ACL                                         )
  302. #define NFSD_WRITEABLE_ATTRS_WORD1                                                          \
  303. (FATTR4_WORD1_MODE              | FATTR4_WORD1_OWNER         | FATTR4_WORD1_OWNER_GROUP     \
  304.  | FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_METADATA | FATTR4_WORD1_TIME_MODIFY_SET)
  305.  
  306. #endif /* CONFIG_NFSD_V4 */
  307.  
  308. #endif /* __KERNEL__ */
  309.  
  310. #endif /* LINUX_NFSD_NFSD_H */
  311.